package com.yuan.algorithms.arithmetic_1;

/**
 * @author YouYuan
 * @contact 1265161633@qq.com
 */

class Node{
	Node preNode;//上一个节点
	Object data;//存储的数据
	Node nextNode;//下一个节点
}
public class LinkedList { 
	private int length;//链表长度
	private Node head, end;//头节点,尾节点(哑元节点)
	private Node current;//当前尾部元素(真实元素)
	public LinkedList() {
		head = new Node();//初始化
		end = new Node();
		length = 0;
	}
	
	/**
	 * 获取头节点
	 * @return
	 */
	public Node getHead() {
		return head.nextNode;
	}
	
	/**
	 * 获取尾节点
	 * @return
	 */
	public Node getEnd() {
		return end.preNode;
	}
	/**
	 * 向链表尾部添加数据
	 */
	public void add(Object data) {
		Node temp = new Node();
		//判断链表是否为空链表
		if (head.nextNode==null || end.preNode==null) {
			//链表为空，则代表temp是实际上的第一个元素，将它的上一个节点设置为head，下一个节点设置为end
			//将head的下一个元素赋值为temp，将end的上一个元素赋值为temp
			head.nextNode = temp;
			end.preNode = temp;
			temp.preNode = head;
			temp.nextNode = end;
			//赋值完成，则temp成功加入到链表中
		}else {
			//链表不为空的情况
			//将当前元素的下一个元素赋值给新加入的temp，将temp的上一个元素设置为当前元素，temp的下一个元素为链表尾end
			current.nextNode = temp;
			temp.preNode = current;
			temp.nextNode = end;
		}
		temp.data = data;//将添加的数据保存到新节点的数据域
		current = temp;//将当前元素设置为新节点
		length++;//链表长度+1
		
	}
	
	/**
	 * 获取链表长度
	 * @return
	 */
	public int getLength() {
		return length;
	}
	
	public static void main(String[] args) {
		LinkedList lk = new LinkedList();
		lk.add("a");//对链表添加元素
		lk.add("b");
		lk.add("c");
		lk.add("d");
		lk.add("e");
		Node temp = lk.getHead();//获取链表的头结点
		while(temp.data!=null){//遍历输出链表元素
			System.out.print(temp.data+" ");
			temp=temp.nextNode;
		}
		
		/*
		 * 以上是链表的添加与遍历操作，请理解后尝试编写链表的查找、删除、更改
		 */
	}

}
